import java.util.Arrays;
import java.util.stream.IntStream;

//public class MaximizeSumOfArrayAfterKNegations0106_1005 {
//    public int largestSumAfterKNegations(int[] nums, int k) {
//        int res = 0;
//        if(k == 0 ) {
//            for (int num : nums) {
//                res += num;
//            }
//            return res;
//        }
//
//        Arrays.sort(nums);
//
//        if( k<= nums.length){
//            if(nums[k-1] <= 0){
//                for (int i = 0; i < k; i++) {
//                    nums[i] = -nums[i];
//                }
//            }else {
//                int i = 0;
//                for ( i = 0; i < k; i++) {
//                    if(nums[i] <= 0) nums[i] = -nums[i];
//                    else break;
//                }
//                Arrays.sort(nums);
//                if( (k-i) % 2 == 1) nums[0] = -nums[0];
//            }
//        }else {
//            int c=1;
//            while (nums[nums.length -1] <= 0 && c <=k ) {
//                for (int i = 0; i < nums.length; i++) {
//                    nums[i] = -nums[i];
//                    c++;
//                }
//                Arrays.sort(nums);
//            }
//            if( (k-c+1) % 2 == 1) nums[0] = -nums[0];
//        }
//
//
//        for (int num : nums) {
//            res += num;
//        }
//        return res;
//
//    }
//
//}


//法2️二
//public class MaximizeSumOfArrayAfterKNegations0106_1005 {
//    public int largestSumAfterKNegations(int[] nums, int k) {
//        //将数组按照绝对值大小 从大到小排序。
//        nums = IntStream.of(nums)
//                .boxed()
//                .sorted((o1,o2) -> Math.abs(o2) - Math.abs(o1))
//                .mapToInt(Integer::intValue)
//                .toArray();
//        int len = nums.length;
//        for (int i = 0; i < len; i++) {
//            //从前向后遍历，遇到负数将其变为正数，同时K--
//            if(nums[i] < 0 && k > 0) {
//                nums[i] = -nums[i];
//                k--;
//            }
//        }
//
//        // 如果K还大于0，那么反复转变数值最小的元素，将K用完
//        if(k%2 == 1) nums[len-1] = -nums[len-1];
//
//        return Arrays.stream(nums).sum();
//    }
//}


//发三 copilot
public class MaximizeSumOfArrayAfterKNegations0106_1005 {
    public int largestSumAfterKNegations(int[] nums, int k) {
        int[] count = new int[201];
        for (int num : nums) {
            count[num + 100]++;
        }
        int i = 0;
        while (k > 0) {
            while (count[i] == 0) {
                i++;
            }
            count[i]--;
            count[200 - i]++;
            if (i > 100) {
                i = 200 - i;
            }
            k--;
        }
        int sum = 0;
        for (int j = i; j < count.length; j++) {
            sum += (j - 100) * count[j];
        }
        return sum;
    }
}
